#ifndef __SERVER_CONFIGURE_H__
#define __SERVER_CONFIGURE_H__

#include "GameEnum.h"
#include <string>
#include <cstdint>
#include "Engine/Vector2.hpp"
#include "Engine/Point3.hpp"
#include <random>
#include "SimpleSingleton.hpp"

using namespace PocketSurvival::Engine;

namespace PocketSurvival
{
    class ServerConfigure : public SimpleSingletonItem
    {
        friend class SimpleSingleton;

    private:
        std::random_device rd;

        ServerConfigure();
        ~ServerConfigure();

        void save();
        void setDefault();

    public:
        std::string serverVerisonName;                      // 服务器版本名称，可以执行修改为其它
        std::string host;                                   // 绑定的ip,支持ipv6, 使用ipv6时填写 "::", ipv4填写"0.0.0.0"
        int32_t port;                                       // 绑定的端口
        int32_t maxPlayer;                                  // 最大玩家数量

        LoginType loginType;                                // 登录类型
        
        bool openPvP;                                       // 是否开启玩家伤害
        int32_t threadCount;                                // 线程池使用的线程数量
        int32_t chunkCatchCount;                            // 区块缓存不够用时新增的区块缓存数(类似对象池)
        int32_t viewChunkCount;                             // 半径的视野内处理的区块， 默认：4 (4*16=64)，也就是类似于视野64格
        std::string password;                               // 是否需要需要密码登录，空字符串为不需要密码
        GameMode gameMode;                                  // 游戏模式
        
        std::string worldDefaultName;                       // 创建新地图时的地图名字，同时也是地图文件夹名称
        int32_t worldDefaultSeed;                           // 创建新地图时的默认种子

        float defaultBiomeSize;                             // 创建新地图时的默认生物群大小
        int32_t defaultSeaLevelOffset;                      // 创建新地图时的海平面高度偏移量
        float defaultTemperatureOffset;                     // 创建新地图时的温度便宜量
        float defaultsetHumidityOffset;                     // 创建新地图时的湿度偏移量
        TerrainGenerationMode defalutTerrainMode;           // 创建新地图时的地形生成模式
        Vector2 defaultIslandSize;                          // 创建新地图时的地形生成模式为岛屿时，对应的岛屿大小
        int32_t defaultTerrainLevel;                        // 创建新地图时的地形生成模式为平地时，地形高度
        float defaultShoreRoughness;                        // 创建新地图时的地形生成模式为平地时，海岸粗糙程度
        int32_t defaultTerrainBlockIndex;                   // 创建新地图时的地形生成模式为平地时，陆地用那种方块
        int32_t defaultTerrainOceanBlockIndex;              // 创建新地图时的地形生成模式为平地时，海洋用什么方块

        EnvironmentBehaviorMode environmentMode;            // 环境模式
        TimeOfDayMode timeOfDayMode;                        // 天气变化模式
        float recoverFator;                                 // 回复速率
        float daySpeed;                                     // 游戏时间速度
        bool areWeatherEffectsEnabled;                      // 是否启用天气影响
        bool isAdventureRespawnAllowed;                     // 是否允许冒险模式重生
        bool areAdventureSurvivalMechanicsEnabled;          // 是否启用冒险生存机制
        bool areSupernaturalCreaturesEnabled;               // 是否启用超自然生物

        bool canCustomSkin;                                 // 能否使用自定义皮肤
        uint32_t skinMaxSize;                               // 限制可使用的皮肤的大小

        bool deadNotDrop;                                   // 是否使用死亡不掉落，仅玩家可以使用
        uint8_t tick;                                       // 每秒运算的次数
        float terrainChunkRecycleTime;                      // 区块回收时间
        uint32_t playerChunkRadius;                         // 加载玩家位置矩形半径的区块，半径是区块半径，一个区块半径是16个方块的长度

        Point3 startSpawnPoint;                             // 起始出生点位置
        float startSpawnPointRadius;                        // 起始出生点位置半径
        bool useConfusionGuid;                              // 玩家的guid是否混淆，防止盗号

        bool use0304;                                       // 是否使用0304的登录方式
    };
}

#endif
